// 15. 提取路由模块-广告管理
import express from 'express'
import Advert from '../models/advert' // 11.3 引入[广告管理]模型
import { showAdvert, showAdvertAdd } from '../controllers/advert'
import formidable from 'formidable' // 19. 引入formidable
import config from '../config' // 20.2 引入配置文件config
import { basename } from 'path' // 20.end同步

// 9. 创建一个路由容器, 将所有的路由中间件挂载给路由容器
const router = express.Router()

// 17.3 配置 广告管理页 的请求路由路径:
router.get('/advert', showAdvert)
// 17.6 配置点击 广告管理页-添加广告 按钮后的跳转路由路径:
router.get('/advert/add', showAdvertAdd)

/**
 * 10.2 表单POST请求
 * URL: /advert/add
 * body: { title标题, image图片路径, link跳转链接, start_time开始时间, end_time结束时间  }
 */
router.post('/advert/add', (req, res, next) => {
  // 19.1.1 fields 就是接收大到的表单中的普通数据字段
  // 19.1.2 files 就是表单中文件上传上来的一些文件信息, 例如文件大小, 上传上来的文件路径...
  const form = formidable({})
  form.uploadDir = config.uploadDir // 20.3 配置 formidable (文件上传)接收路径
  form.keepExtensions = true // 20.3 配置保持文件原始的扩展名
  form.parse(req, (err, fields, files) => {
    if (err) {
      return next(err)
    }
    const body = fields // 普通表单字段

    // 19.2 在这里把 files 中的图片处理一下
    // 👉测试 body 输出的时候, 需将 [advert_add.html] 的JS执行脚本注释(变同步)
    // console.log(body)
    body.image = basename(files.image.path) // 20.end 这里解析提取上传的文件名，保存到数据库

    // 2. 操作数据库
    const advert = new Advert({
      title: body.title,
      image: body.image,
      link: body.link,
      start_time: body.start_time,
      end_time: body.end_time,
    })

    advert.save((err, result) => {
      if (err) {
        return next(err)
      }
      res.json({
        err_code: 0,
      })
    })
  })
})

// 12. 查询所有数据的
router.get('/advert/list', (req, res, next) => {
  Advert.find((err, docs) => {
    if (err) {
      return next(err)
    }
    res.json({
      err_code: 0,
      result: docs,
    })
  })
})

// 12.end 根据ID查询单个数据集
router.get('/advert/koishi/:advertId', (req, res, next) => {
  // console.log('请求成功哩!!!') // 打印在console控制台的
  // res.end('喵喵喵~~~') // 打印在postman请求成功后的控制台下的~~~
  // res.end(`路径参数为: ${req.params.advertId}`)

  // 细节2: 使用 postman 测试查询某个ID数据时, 可先在list复制那个id值进行拼接查找~~~
  Advert.findById(req.params.advertId, (err, result) => {
    if (err) {
      return next(err)
    }
    // 请求成功, 则返回JSON型数据:
    res.json({
      err_code: 0,
      result: result,
    })
  })
})
// 👆补充笔记:
// '/advert/koishi/:advertId' ->是一个模糊匹配路径
// 可以匹配形如: /advert/one/* 的路径形式
// 例如: (/advert/one/1)、(/advert/one/2)、(/advert/one/3)
// 但是像: '/advert/one' 或 '/advert/one/a/b' 是不行滴
// 至于 advertId 是我们起的一个(具有标志意义的)名字, 并且可在处理函数下通过 req.params 进行获取!

// 13. 更新广告数据
router.post('/advert/edit', (req, res, next) => {
  // 细节3: 先查到ID对应的数据, 再实现最终(编辑)更新效果...
  // *测试编辑接口的时候, 可给body加多一个id值,,,
  Advert.findById(req.body.id, (err, advert) => {
    if (err) {
      return next(err)
    }
    const body = req.body
    advert.title = body.title
    advert.image = body.image
    advert.link = body.link
    advert.start_time = body.start_time
    advert.end_time = body.end_time
    advert.last_modified = Date.now() // *最后更新的时间

    // 细节4: 这里的 save 因为内部有一个 _id 所以这里是不会新增数据的，而是更新已有的数据
    advert.save((err, result) => {
      if (err) {
        return next(err)
      }
      res.json({
        err_code: 0,
      })
    })
  })
})

// 14. 删除广告数据
router.get('/advert/remove/:adverId', (req, res, next) => {
  Advert.remove({ _id: req.params.adverId }, (err) => {
    if (err) {
      return next(err)
    }
    res.json({
      err_code: 0,
    })
  })
})

// 9.1 将 router 暴露给外部
export default router
